package cn.initcap.service;

import cn.initcap.entity.OrderInfo;
import cn.initcap.entity.SeckillUser;
import cn.initcap.vo.GoodsVo;
import java.awt.image.BufferedImage;
import java.util.List;

/**
 * @author initcap
 * @date Created in 2018/8/10 PM4:39.
 */
public interface SeckillService {

    /**
     * 减库存 下订单 写入秒杀订单
     *
     * @param user  用户实体类
     * @param goods 商品展示实体类
     * @return 订单详情实体类
     */
    OrderInfo miaosha(SeckillUser user, GoodsVo goods);

    /**
     * 减库存 下订单 写入秒杀订单
     *
     * @param user  用户实体类
     * @param goods 商品展示实体类
     * @return 订单详情实体类
     */
    OrderInfo seckill(SeckillUser user, GoodsVo goods);

    /**
     * 判断用户是否秒杀到商品，秒杀到会返回订单的编号
     *
     * @param userId  用户编号
     * @param goodsId 商品编号
     * @return -1 为失败，成功返回订单编号，0 排队中
     */
    long getMiaoshaResult(Long userId, long goodsId);

    /**
     * 重新设置
     *
     * @param goodsList 商品集合
     */
    void reset(List<GoodsVo> goodsList);

    /**
     * 验证请求路径
     *
     * @param user    用户
     * @param goodsId 商品编号
     * @param path    请求路径
     * @return true 合法
     */
    boolean checkPath(SeckillUser user, long goodsId, String path);

    /**
     * 生成秒杀请求路径
     *
     * @param user    用户
     * @param goodsId 商品编号
     * @return 请求路径
     */
    String createMiaoshaPath(SeckillUser user, long goodsId);

    /**
     * 生成图形验证码
     *
     * @param user    用户
     * @param goodsId 商品编号
     * @return 图片
     */
    BufferedImage createVerifyCode(SeckillUser user, long goodsId);

    /**
     * 检查验证码是否正确
     *
     * @param user       用户
     * @param goodsId    商品编号
     * @param verifyCode 验证码
     * @return true 通过
     */
    boolean checkVerifyCode(SeckillUser user, long goodsId, int verifyCode);

}
